#include "plaintext.h"

/* *
 * @brief 默认构造函数，初始化 Plaintext 对象。
 *
 * @param None
 * @return None
 */
Plaintext::Plaintext() : mx(nullptr), N(0), slots(0), l(0) {}

/* *
 * @brief 带参数构造函数，初始化 Plaintext 对象。
 *
 * @param mx：指向多项式系数数组的指针。
 * @param N：多项式的数量。
 * @param slots：槽的数量。
 * @param l：多项式的每个层级的长度。
 * @param scale：缩放因子。
 * @return None
 */
Plaintext::Plaintext(uint64_t *mx, long N, long slots, long l)
    : mx(mx), N(N), slots(slots), l(l)
{}

/* *
 * @brief 拷贝构造函数，初始化 Plaintext 对象为另一个对象的副本。
 *
 * @param ptxt：待拷贝的 Plaintext 对象。
 * @return None
 */
Plaintext::Plaintext(const Plaintext &ptxt) : N(ptxt.N), slots(ptxt.slots), l(ptxt.l)
{
    mx = new uint64_t[N * l];
    for (long i = 0; i < N * l; i++) {
        mx[i] = ptxt.mx[i];
    }
}

/* *
 * @brief 赋值运算符重载，执行深拷贝。
 *
 * @param o：待赋值的 Plaintext 对象。
 * @return Plaintext&：返回当前对象的引用。
 */
Plaintext &Plaintext::operator = (const Plaintext &o)
{
    if (this == &o) {
        return *this;
    }
    delete[] mx;
    N = o.N;
    l = o.l;
    slots = o.slots;
    mx = new uint64_t[N * l];
    for (long i = 0; i < N * l; i++) {
        mx[i] = o.mx[i];
    }
    return *this;
}
